package com.atguigu.juc.juc_3utils;

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @Author yanglin [2533188365@qq.com]
 * @Create 2024-04-26 17:28
 * @Description:
 */
public class SemaphoreDemo {


    /**
     * 主要有两个目的”
     *  1、多个共享资源的互斥使用
     *  2、用于并发线程数的控制。保护一个关键部分不要一次输入超过n个线程
     */

    public static void main(String[] args) {

        //6辆车抢占3个车位
        Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < 6; i++) {
            new Thread(() -> {
                try {
                    //通知其他线程，当前线程已抢到
                    semaphore.acquire();
                    System.out.println("第" + Thread.currentThread().getName() + "个线程已抢到");
                    //模拟正在处理业务
                    TimeUnit.SECONDS.sleep(new Random().nextInt(5));
                    //通知其他线程，当前线程已释放
                    semaphore.release();
                    System.out.println("第" + Thread.currentThread().getName() +"个线程已释放");
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            },String.valueOf(i)).start();

            //第0个线程已抢到
            //第2个线程已抢到
            //第1个线程已抢到
            //第2个线程已释放
            //第3个线程已抢到
            //第1个线程已释放
            //第3个线程已释放
            //第4个线程已抢到
            //第5个线程已抢到
            //第0个线程已释放
            //第4个线程已释放
            //第5个线程已释放
        }

    }

}
